package com.cb2.algorithm.leetcode;

/**
 * <a href='https://leetcode.cn/problems/add-digits'>各位相加(Add Digits)</a>
 * <p>给定一个非负整数 num，反复将各个位上的数字相加，直到结果为一位数。返回这个结果。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 *  示例 1:
 *
 *      输入: num = 38
 *      输出: 2
 *      解释: 各位相加的过程为：
 *          38 --> 3 + 8 --> 11
 *          11 --> 1 + 1 --> 2
 *          由于 2 是一位数，所以返回 2。
 *
 *  示例 2:
 *      输入: num = 0
 *      输出: 0
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>0 <= num <= 2^31 - 1</li>
 * </ul>
 * </p>
 * <b>进阶：你可以不使用循环或者递归，在 O(1) 时间复杂度内解决这个问题吗？</b>
 *
 * @author c2b
 * @since 2025/4/28 11:28
 */
public class LC0258AddDigits_S {
    static class Solution {
        public int addDigits(int num) {
            while (num >= 10) {
                int sum = 0;
                while (num > 0) {
                    sum += num % 10;
                    num /= 10;
                }
                num = sum;
            }
            return num;
        }

        /**
         * <a href='https://leetcode.cn/problems/add-digits/solutions/1301157/ge-wei-xiang-jia-by-leetcode-solution-u4kj'>方法二：数学</a>
         */
        public int addDigits2(int num) {
            return (num - 1) % 9 + 1;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.addDigits(38));
        System.out.println(solution.addDigits(0));
    }

}
